package gbench.mydata.driver;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.util.Properties;
import java.util.regex.Pattern;

import gbench.common.tree.LittleTree;
import gbench.common.tree.LittleTree.IRecord;
import gbench.mydata.driver.core.jdbc.AbstractDriver;

/**
 * 第一步：导入实现java.sql这个包中接口的的各个厂商实现的驱动包 <br>
 * 第二步：加载并注册驱动程序（java.sql.Driver接口的实现类）<br>
 * 第三步：获取java.sql.Connection的实现类对象（数据库连接对象） <br>
 * 第四步：编写Statement/PreparedStatement <br>
 * 第五步：执行sql语句 <br>
 * 第六步：如果是查询语句，那么会得到ResultSet对象，对ResultSet对象进行一系列处理，然后关闭ResultSet对象；如果是增删改操作，那么省略这一步
 * <br>
 * 第七步：关闭Statement对象 <br>
 * 第八步：关闭Connection对象 <br>
 * 
 * @author gbench
 *
 */
public class MyDataDriver extends AbstractDriver {

    @Override
    public Connection connect(String url, Properties info) throws SQLException {
        if (this.acceptsURL(url)) {
            return new MyDataConnection(this.driverInfo);
        } else {
            throw new SQLException(LittleTree.MFT("{0} 格式错误", url));
        }

    }

    /**
     * 识别是否为可以接受的 url 格式 "jdbc:gbench:mydata://localhost/mydb3?nossl"
     */
    @Override
    public boolean acceptsURL(String url) throws SQLException {

        if (url == null) {
            return false;
        }

        final var matcher = Pattern
                .compile("\\s*jdbc\\s*:\\s*mydata\\s*:\\s*([\\w]+)\\s*:\\s*//([^/]+)/([\\w\\d]+)(.*)?",
                        Pattern.CASE_INSENSITIVE)
                .matcher(url);

        // println(url);

        if (matcher.matches()) {
            final var type = matcher.group(1);// type
            final var host = matcher.group(2);// host
            final var sheet = matcher.group(3);// sheet
            final var file = matcher.group(4);// file

            driverInfo = IRecord.REC("type", type, "host", host, "sheet", sheet, "file", file);
            // println(driverInfo);

            return true;
        }

        return false;
    }

    /**
     * 自动注册驱动程序，这样 当 类 被加载的时候 驱动程序 就会 自动被 注册到 DriverManager 之中
     */
    static {
        try {
            DriverManager.registerDriver(new MyDataDriver());
        } catch (SQLException e) {
            e.printStackTrace();
        } // try
    }

    private IRecord driverInfo;

}
